Eksport lokacji do D'jinniego
Kategoria:Treści_graficzne W artykule: Wstęp do eksportu modeli na samej górze znajdziesz link do pobrania kompletnego pakietu exportera do 3DS MAX oraz opis instalacji. Podstawowe elementy sceny przygotowanej do exportu Wstęp Scena składa się z elementów geometrii widocznej, walkmesha, świateł typu AuraBase, drzwi, emiterów. 600px| Uwaga. Kliknij na obrazku, żeby powiększyć. Aura Base Eksportowane są tylko elementy zalinkowane do specjalnego obiektu AuraBase oraz niektóre elementy walkmesha (komponenty znajdujące się na liście modyfikatora Walkmesh Mod). Obiekt AuraBase znajduje się w kategorii helpers. 600px| Najważniejszym parametrem w AuraBase jest animacja 24 godzinna (Anim24h), która powinna się znaleźć na liście Animations z ustalonym zakresem klatek animacji Start: 0 End: 24. Pole Detail map zawiera nazwę tekstury mapy detali dla całej lokacji. Dummy lokacji Scena zawiera również w swojej hierarchii dodatkowy obiekt typu Dummy, do którego podlinkowane są animowane elementy lokacji (np. światła AuroraLight z animowanymi parametrami dla zmieniających się pór dnia). Obiekt ten musi być specjalnie nazwany. Jego nazwa jest identyczna z nazwą AuraBase ale rozszerzona o dodatkową literkę „a” na końcu. Obiekt „north” Specjalny obiekt typu Dummy o nazwie „north” podlinkowany do Dummy lokacji służy do wyznaczenia kierunku północnego potrzebnego do ukierunkowania mini-mapy w grze. Oś Y w lokalnym układzie współrzędnych obiektu „north” wskazuje północ. Ponadto obiekt typu placeable skybox jest automatycznie obracany w kierunku osi Y obiektu „north”. Geometria widoczna Może to być każdy obiekt Editable Mesh. Modyfikator AuraPoly zawiera wszelkie dodatkowe parametry, takie jak ustawienia lightmap. Parametry dla lightmap zostały opisane w innym dokumencie. Pozostałe podstawowe parametry dla obiektów geometrii stałej w lokacji: 600px| Drzwi Drzwiami może zostać każdy obiekt zbliżony kształtem do boxa. Ważną czynnością jest odpowiednie ustawienie osi obrotu, a więc punktu pivot i jego orientacja w lokalnym układzie współrzędnych. Najprostszą zasadą jest takie ustawienie osi punktu pivot aby współrzędna X była skierowana, jak na poniższym rysunku, na zewnątrz ale równolegle do płaszczyzny drzwi. Takie ustawienie osi jest potrzebne do prawidłowej orientacji względem animacji otwierania drzwi, która jest zapisana w pliku zewnętrznym door_x01.mdl. Jest to plik uniwersalny używany przez większość drzwi. Obiekt który ma być drzwiami musi mieć modyfikator Door. Podczas nadawania modyfikatora Door generowany jest unikalny numer ID. Należy wskazać plik z animacją (door_x01.mdl) oraz Template (.utd) potrzebny do edytora D’jini. Potrzebny Template można uzyskać poprzez skopiowanie któregoś z już istniejących i nadanie mu nowej nazwy. 600px| Jeżeli w scenie znajdują się drzwi to podczas eksportu zostanie utworzony folder nazwalokacji_doors zawierający odpowiednie pliki. Drzwi w systemie Blendbox Każde drzwi mogą wymuszać znikanie określonego obiektu (fragmentu geometrii wokół drzwi) oraz niwelowanie kolizji dla kamery w celu ułatwienia przechodzenia pomiędzy pomieszczeniami. Do tego celu potrzebny jest dodatkowy obiekt Box o specjalnej nazwie „Blendbox”. Określa on swoją bryłą zakres powyższych zmian. Musi on być zalinkowany do drzwi. Jego działanie objawia się znikaniem (po otwarciu drzwi) obiektów, z którymi ma część wspólną (przecina się). Obiekt, który ma być poddany działaniu Blendboxa, musi mieć to zaznaczone w swoim modyfikatorze AuraPoly. Również trójkąty walkwesha kolizyjnego, które przecinają się z Blendboxem zmienią swoje ID (21) na niekolizyjne po otwarciu drzwi. 600px| Światła dynamiczne Są to światła służące do oświetlania geometrii, która nie ma przypisanych lightmap, a więc postaci, obiektów Placeable, lokacji typu generic bez lightmap oraz rozświetlania w sposób dynamiczny niektórych obiektów z lightmapą. Mogą one być eksportowane wraz z lokacją. Najczęściej są to światła animowane w cyklu 24h. Animowane parametry to Multiplier oraz Color. Uwaga: wszystkie eksportowane parametry tych świateł ustawiane są na rolecie AuroraLight Parameters. 600px| Materiały Wszystkie materiały przypisuje się w edytorze materiałów. 1) Materiały standardowe Podstawowym typem jest materiał Standard z mapą Diffuse. Przypisana tekstura (w formacie .tga) może mieć kanał przeźroczystości alpha i może (ale nie musi) być przypisana również jako Opacity map w materiale Standard. W przypadku zastosowania materiału Standard z mapą przeźroczystości, na sposób jej wyświetlania ma wpływ ustawienie opcji Render list w modyfikatorze AuraPoly (Opaque, Transparent). Powszechnie stosowany jest multumateriał typu Multi/Sub-Object. Uwaga: z materiału Standard eksportowany jest kolor Diffuse, co powoduje odpowiednie zabarwienie. Aby uzyskać neutralny odcień tekstury należy zmienić kolor Diffuse na biały. 600px| 2) Materiały typu Aurora Material i TestMat Materiały Aurora Material i TestMat dają możliwośc przypisywania shaderów zapisanych w zewnętrznych plikach tekstowych. Shadery to pliki .mfx i znajdują się one w D:\Witcher\Stable\scripts. Aurora Material i TestMat dają takie same możliwości przypisania shakerów. Różnią się sposobem zapisu i edycji parametrów materiału. Aurora Material korzysta z zewnętrznego pliku tekstowego .mat, w którym są zapisane odpowiednie parametry konfiguracyjne. Znajdują się one w D:\Witcher\Data\Materials\Materials. Daje to możliwość późniejszej edycji materiału bez potrzeby ponownego eksportu sceny. 600px| Należy zwrócić uwagę na ilość obiektów mających włączone odbicia. Ta opcja jest włączana dla materiału, a nie dla obiektu, więc należy stosować ją bardzo ostrożnie. Rekomendowane jest by tylko jeden obiekt w scenie miał odbicia. Musi to być obiekt całkowicie płaski (tworzyć jedną płaszczyznę). Ściślej mówiąc w scenie może być tylko jedna płaszczyzna odbicia, można ją uzyskać również z kilku obiektów ale muszą one leżeć na jednej płaszczyźnie (w przeciwnym wypadku odbicia będą obliczane tyle razy, ile jest płaszczyzn odbicia, co spowoduje ogromne straty wydajności). TestMat nie korzysta z zewnętrznego pliku konfiguracyjnego. Wszystkie parametry materiału dla wybranego shadera można ustawiać bezpośrednio w edytorze materiałów i są one zapisywane w pliku .max razem ze sceną. Shadery to pliki .mfx i znajdują się one w D:\Witcher\Stable\scripts. 600px| Texture Paint Texture Paint służy do malowania wierzchołków siatki teksturami. Obiekt przeznaczony do malowania musi być Editable Mesh i mieć przypisany modyfikator Texture Paint. Następnie trzeba mu nadać materiał Multi/Sub Object z przypisanymi teksturami. Tekstury te mają na kanale alpha zapisaną maskę specular i można je rozpoznać po nazwie prefix: trn_ Aby uwidocznić w podglądzie 3dsMax materiał Texture Paint należy w jednym z pod-materiałów materiału Multi/Sub Object włączyć plugin materiał o nazwie Texture Paint Shader. Operacja nadania materiału Multi/Sub Object powoduje, że w modyfikatorze Texture Paint pojawia się lista tekstur/materiałów, którymi można zacząć malować. Kolejność materiałów w materiale Multi/Sub Object odpowiada kolejności na liście modyfikatora Texture Paint. Uwaga: nie należy zmieniać liczby wierzchołków obiektu z modyfikatorem Texture Paint, gdyż zniszczy to informacje o malowaniu na nim. Aby zmodyfikować taki obiekt należy dokonać operacji collapse Texture Painta. Wówczas informacje o malowaniu zostaną utrwalone na poziomie Editable Mesh. W takim wypadku będzie potrzebna korekta(malowanie) jedynie tego obszaru, w którym zmieniono liczbę wierzchołków. Możliwa jest modyfikacja tego obiektu również za pomocą Editable Poly, jednak wówczas nie może być wyświetlany Texture Paint Shader – można chwilowo np. zmienić materiał na inny. 600px| Trawy Z modyfikatorem Texture Paint powiązana jest funkcja wysiewania traw. Idea wysiewu traw polega na przypisywaniu konkretnych gatunków traw do materiałów terenu pomalowanego za pomocą Texture Paint. Dostępne sety traw można znaleźć w modyfikatorze Grass przypisanym do Aura Base sceny. Modyfikator ten umożliwia przypisanie setów traw do materiałów Texture Paint. Odbywa się to poprzez podwójne klikniecie na liście Grass Sets wybranego setu traw. Przyciski poniżej tej listy odpowiadają przyciskom w modyfikatorze Texture Paint. W każdym zastosowanym Texture Paint w tej scenie będzie przypisana taka sama sekwencja setów traw. 600px| Rozkład wysiewu traw jest zapisywany na specjalnej teksturze .vgm Jest ona generowana automatycznie podczas rozkładania UVW dla traw. Aby dokonać rozkładu należy przejść do modyfikatora Walkmesh Mod na obiekcie AuraBase sceny. Dla danego obiektu znajdującego się na liście komponentów zaznaczyć pole Has grass. Ta operacja powoduje dodanie modyfikatora BakeWeightMap do AuraBase sceny i umieszczenie danego obiektu na liście Target Objects, a więc na tym obiekcie będzie wysiewana trawa. Modyfikator BakeWeightMap zawiera również listę Source Obiects, do której przypisujemy obiekty z pomalowane Texture Paintem z przypisanymi slotami traw. Na liście Source Objects można umieścić ten sam obiekt co na liście Target Objects, co spowoduje wysianie trawy na nim samym. Z powyższego wynika, że możemy wysiać trawę na dwa sposoby: * wysiew na dowolną nierenderowalną powierzchnię Walkmesha ‐ zostaje rzutowany obraz rozkładu trawy z obiektu malowanego Texture Paintem (np. terenu), * wysiew bezpośrednio na geometrię lokacji (np. teren) ‐ zostaje rzutowany obraz rozkładu trawy z tego samego obiektu (malowanego Texture Paintem). Uwaga 1: nie wolno edytować listy Target Objects ręcznie. Odpowiedni obiekt zostanie tam umieszczony automatycznie za pośrednictwem Walkmesh Mod. Uwaga 2: z powodu znanego błędu w kolejności przypisywania obiektów do listy Source Objects , może się zdarzyć, że nie będzie można przypisać do niej obiektu, który wcześniej znalazł się na liście Target Objects. W takim przypadku rekomendujemy obejście problemu poprzez: * chwilowe odznaczenie dla tego obiektu pola Has grass w Walkmesh Mod (co spowoduje zdjęcie go z listy Target Objects), * wprowadzanie obiektu na listę Source Objects (teraz już możliwe), * ponowne zaznaczenie pola Has grass w Walkmesh Mod. Jeżeli odznaczenie pola Has grass w Walkmesh Mod powoduje usunięcie modyfikatora BakeWeightMap to, aby temu zapobiec, należy wcześniej tymczasowo dodać jakiś inny obiekt z włączonym polem Has grass. 600px| Po umieszczeniu wszystkich obiektów na odpowiednich listach należy uruchomić Render, co spowoduje przypisanie modyfikatora BWM UVW Map do wszystkich obiektów z Has grass. Zawiera on dane o rozkładzie UVW na kanale 6 dla traw. Tekstura zostanie wyrenderowana w rozdzielczości regulowanej parametrem Grid Size pod nazwą wskazaną w polu Output File. Walkmesh Walkmesh składa się z dwóch rodzajów geometrii: kolizyjnej i nawigacyjnej. 600px| Geometria kolizyjna Każdy obiekt może spełniać rolę Walkmesha kolizyjnego. Jednak z powodów optymalizacyjnych często stosuje się specjalną geometrię uproszczoną. Aby dany obiekt stał się walkmeshem należy go umieścić w modyfikatorze Walkmesh Mod, który powinien być dodany do AuraBase sceny. Walkmesh Mod zawiera listę Components, do której są dodawane wszystkie obiekty mające być walkmeshem. Mogą się więc na niej znaleźć zarówno obiekty kolizyjne specjalne (niewidoczne) jak i elementy lokacji (widoczne). Specjalna geometria kolizyjna nie powinna być zalinkowana do AuraBase sceny. 600px| Ważnym parametrem dla geometrii kolizyjnej jest odpowiednie ID materiału dla poszczególnych ścianek tego obiektu. ID określa bowiem rodzaj kolizji oraz dźwięków z nią związanych w tym dźwięków chodzenia po różnych rodzajach podłoża. Jeżeli stosujemy parametr IDs from texture właściwości poszczególnych ID zależą od nazwy katalogu z daną teksturą. Stosujemy następującą strukturę katalogów: Grafika:pel_15.jpg W przypadku nie używania parametru IDs from texture, zostaną użyte właściwości ID zapisane w pliku zewnętrznym D:\Witcher\Data\2DA\engine\surfacemat.2da Uwaga: numery ID w 3dsMax są liczone od 0. Więc do danej pozycji z pliku surfacemat.2da należy dodać +1 dla ID w 3dsMax. Np. aby uzyskać właściwości ID 20 CameraCollision należy w 3dsMax użyć numeru ID = 21 Można używać materiału pomocniczego dla lepszej orientacji w 3dsMax ale nie jest on eksportowany. Fragment pliku surfacemat.2da: 600px| Najważniejsze właściwości ID: *'WalkCheck': Do tych ścianek postać będzie dociągana (po tych powierzchniach będzie się poruszać) *'Walk' : nie używane *'LightCheck': Te ścianki będą używane przy oświetlaniu obiektów od lightmapy walkmesha *'LineOfSight': Te ścianki są przeszkodą we wzajemnym widzeniu się postaci *'CameraColl': Z tymi ściankami kamera ma kolizje *'PhysicsColl': Z tymi ściankami jest kolizja dla pozostałej fizyki (poza kamerą) Geometria nawigacyjna Określa zakres chodzenia postaci oraz służy do systemu wyszukiwania ścieżek. Nie jest ona używana bezpośrednio do chodzenia, a jedynie wyznacza ramy poruszania się postaci po geometrii kolizyjnej. W jej budowie najważniejszy jest zasięg w osi X i Y (2D). Oznacza to, że nie jest potrzebne dokładne dopasowanie do powierzchni kolizyjnej na wysokość (tolerancja w osi Z wynosi +/‐ 0,5 metra). Natomiast nie może ona wyznaczać obszaru do chodzenia poza zasięgiem geometrii kolizyjnej (postać nie miałaby po czym chodzić). Nie może też zawierać trójkątów jednych ponad drugimi oraz zbyt stromo wznoszącej się powierzchni. Minimalna szerokość przejść ok. 1,5 m. Aby utworzyć geometrię nawigacyjną należy ją zalinkować do AuraBase sceny oraz przypisać modyfikator RoomPaint. Modyfikator ten zidentyfikuje obiekt jako geometrię nawigacyjną. Podstawową funkcją modyfikatora RoomPaint jest wyznaczenie pokoi w celu optymalnej obsługi wyszukiwania ścieżek. Aby wyświetlić pokoje należy w materiale tego obiektu włączyć RoomPaintShader (na podobnej zasadzie, jak w przypadku materiału Texture Painta). Pokoje można zacząć malować na tych ściankach obiektu, których ID jest w pliku surfacemat.2da określona jako do chodzenia. Użycie modyfikatora RoomPaint powoduje nadanie obiektowi specjalnych ID, których nie należy zmieniać ręcznie. Pokoje nie mogą się powtarzać – każdy ma unikalne ID. Do malowania używamy w zasadzie tylko trzech funkcji RoomPainta: Paint, FloodFill, Find Free. Jeżeli zajdzie potrzeba zmiany geometrii pomalowanego obiektu należy: skasować modyfikator RoomPaint, wyłączyć RoomPaintShader (lub zmienić chwilowo materiał na standardowy), dokonać żądanej edycji siatki, a następnie przywrócić modyfikator i materiał. 600px| Zasady stosowania podziału na pokoje Odpowiedni podział ma kluczowy wpływ na wydajność i jakość wyszukiwania ścieżek. Podstawowe własności podziału: * Dwa pokoje może łączyć TYLKO JEDNA krawędź. Grafika:pel_18a.jpg Grafika:pel_18b.jpg * Pokój jest obszarem spójnym. Nie musi być wypukły, może też zawierać „dziury”. Warto próbować tworzyć pokoje wypukłe. Nie ma takiego ograniczenia w silniku, ale warto się tego w większości przypadków trzymać. Jednak bez przesady. Malutkie wgłębienia psujące wypukłość pokoju nie są problemem. * Ciasne przejścia należy zaznaczać małymi pokojami 600px| * Bardzo ważne jest, by z jednego pokoju istniało przejście do następnego, z którym jest połączony. * Nie ma ograniczeń co do wielkości, warto jednak trzymać pewien standard (charakterystyczny dla danego obszaru). Otwarte przestrzenie mogą być wypełnione większymi pokojami, zamknięte pomieszczenia powinny być wypełnione mniejszymi. Ogólnie – większy pokój to szybkie wyszukiwanie RGS i większa prostota mapy. Mniejszy pokój – dużo szybsze sprawdzenie, że ścieżka „nie istnieje”. * Trzeba mniej więcej wiedzieć, jakie będzie rozmieszczenie placeable na mapie. Unikać podziału na pokoje, w których na krawędziach będą umieszczone placeable. Przy natłoku placeable’i lepiej zastosować większe pokoje (np. odpowiadające pokojom rzeczywistym). * Warto tereny znajdujące się na różnych wysokościach oznaczać jako różne pokoje. O tym będzie jeszcze dalej. * Uważać z tworzeniem małych pokoików. Upewnijmy się, że wiedźmin znajdzie przez nie drogę. TRIKI: * 1) Pochyłości. Jeżeli chcemy by wiedźmin szukał przejść w rodzaju schodów – i brał pod uwagę pochyłości już w fazie przeszukiwania po pokojach – ustawmy krawędź pokoju dokładnie na krawędzi pochyłości. * 2) Wydajność. Na najniższym poziomie wyszukiwania ścieżek, badając przejścia pomiędzy pokojami, pod uwagę bierzemy punkty leżące dokładnie na środku łączących je krawędzi. Możemy otrzymać olbrzymi wzrost wydajności systemu wyszukiwania ścieżek, jeżeli będziemy stosowali właściwą metodologię podziału na pokoje. W miarę możliwości, starajmy się zapewniać, by dla każdego pokoju, istniało bezpośrednie przejście pomiędzy wszystkimi środkami jego krawędzi z innymi pokojami (stąd dobrze tworzyć pokoje wypukłe). Bezpośrednie przejście to takie, które nie wymaga włączania systemu wyszukiwania ścieżek najniższego poziomu, co oznacza, że postać może zostać przeprowadzona bezkolizyjnie w linii prostej pomiędzy danymi punktami.